#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//堆中处理结构体数组的指针成员
//通过堆内存实现动态数组
struct man
{
    char *name;
    int age;
    int classid;
};


int main()
{
    struct man *p = NULL;//在栈里面有一个指针变量p，p的值是NULL

    int i = 1;
    while (1)
    {
        printf("input 'exit' to exit!\n");
        printf("please input name:");
        //作用是，给name分配一个合适的内存空间
        char tmp[1024] = { 0 };//定义一个空的数组，大小1024char
        scanf("%s", tmp);//获取这个char数组的字符串，也就是name
        //如果用户名字等于exit，我们就退出循环
        if (strcmp(tmp, "exit") == 0)
            break;
        p = realloc(p, sizeof(struct man) * 1);
        p[i - 1].name = malloc(strlen(tmp) + 1);
        strcpy(p[i - 1].name, tmp);

        printf("please input age:");
        scanf("%d", &p[i - 1].age);

        printf("please input chassid:");
        scanf("%d", &p[i - 1].classid);
        i++;
    }

    int a;
    for (a = 0; a < i - 1; a++)
    {
        printf("%s, %d, %d\n", p[a].name, p[a].age, p[a].classid);
    }

    //先释放离散的name空间
    for(a = 0; a < i - 1; a++)
    {
        free(p[a].name);
    }

    //最后释放p空间
    //释放堆中连续的空间，（就是堆中的数组)
    free(p);
    return 0;
}

